/*$Id: ME2FCCore.h,v 1.1 2008/10/17 06:08:18 leon Exp $*/

#ifndef _ME2FC_CORE_H
#define _ME2FC_CORE_H

#include "clfc/clfc.h"

//Note:
// below code will be moved to ME2FC
// 2002-4-2 14:56

// v2.0 2006-2-22
class ME2Str {
public:
	LPCSTR		m_data;
	int		m_len;

	void init() {	m_data=0; m_len=0; }


	ME2Str() { init(); }	
	ME2Str(LPCSTR s,int len=-1) { init(); assign(s,len); }
	~ME2Str() { init(); }
	
	int empty() const { return m_len==0; }
	int length() const {	return m_len; }

	//operator
	char at(int n) const {	if(n>=0&&n<m_len) return m_data[n];	else return 0;	}
	char operator [](int n) const {	return at(n); }
	
	//func
	void assign(LPCSTR s,int len=-1) { m_data = s; m_len = (len==-1?strlen(s):len);}
	
	void operator =(LPCSTR s) { assign(s); }
	void operator =(const ME2Str& str) { assign(str.m_data, str.m_len); }
	int operator ==(LPCSTR s) const { return (cmp(s)==0); }
	int operator !=(LPCSTR s) const { return cmp(s); }
	int cmp(LPCSTR s,int len=-1) const;	
	
	void ltrim(LPCSTR trim_chars);
	void rtrim(LPCSTR trim_chars);
	void trim(LPCSTR trim_chars) { ltrim(trim_chars); rtrim(trim_chars); }
			
	ME2Str substr(int pos=0,int count=-1) const;
	int find(LPCSTR s1,int pos=0,int len=-1) const;
	int find_first_of(LPCSTR s,int pos=0) const ;
};

class ME2PtrArray 
{
public:
	int	m_size;
	int	m_len;
	void** m_data;	


	void IncBuf(int growSize = 10);
	void Empty(){	if(m_data) free(m_data); m_data = 0; m_len = 0; m_size = 0;}
	void* RemoveAt(int pos);
	ME2PtrArray() { m_size = 0; m_len = 0; m_data = 0; }
	~ME2PtrArray() { 	Empty(); }

	int	GetCount() const {	return m_len; }
	int IsEmpty() const { return m_len == 0; }
	
	void RemoveAll() {	m_len = 0; }
	void* operator[](int nIndex) const { return m_data[nIndex]; }
	void* At(int nIndex) const { return m_data[nIndex]; }
	void AddTail(void* p) { IncBuf(); m_data[m_len++] = p; }
#ifdef _DEBUG
	void Dump();
#endif
};
class ME2StrArray:public ME2PtrArray
{
public:
	ME2StrArray(){}
	~ME2StrArray() {	for(int i = 0; i < m_len; i++) delete (CLStr*)m_data[i]; }
	
	void AddTail(LPCSTR str) { ME2PtrArray::AddTail(new CLStr(str)); }
	CLStr& operator[](int nIndex) const {	return *(CLStr*)m_data[nIndex]; }
};
struct ME2MapStrToPtrNode {
	CLStr key;
	void* val;	
};
class ME2MapStrToPtr:public ME2PtrArray
{
public:
	void* SetValI(LPCSTR keyName, void* val);
	void* SetVal(LPCSTR keyName, void* val);
	void* RemoveAt(int pos);
	ME2MapStrToPtr() {}
	~ME2MapStrToPtr() {	for(int i = 0; i < m_len; i++) delete (struct ME2MapStrToPtrNode*)m_data[i]; }

	int	  Find(LPCSTR keyName) const;
	int	  FindI(LPCSTR keyName) const;
	void* GetVal(LPCSTR keyName) const ;
	void* GetValI(LPCSTR keyName) const ;
	void  AddTail(LPCSTR keyName, void* p);
	LPCSTR Key(int nIndex) const {	return ((ME2MapStrToPtrNode*)m_data[nIndex])->key; }
	void*  Val(int nIndex) const {  return ((ME2MapStrToPtrNode*)m_data[nIndex])->val; }
};
class ME2MapStrToStr:public ME2MapStrToPtr
{
public:
	void SetValI(LPCSTR key, LPCSTR val);
	void SetVal(LPCSTR key, LPCSTR val);
	void RemoveAt(int pos);
	ME2MapStrToStr() {}
	~ME2MapStrToStr() { for(int i = 0; i < m_len; i++) delete (CLStr*)((struct ME2MapStrToPtrNode*)m_data[i])->val; }
		
	int GetVal(LPCSTR keyName, CLStr& val) const ;
	int GetValI(LPCSTR keyName, CLStr& val) const ;
	void AddTail(LPCSTR keyName, LPCSTR val) {	ME2MapStrToPtr::AddTail(keyName, new CLStr(val)); }
	LPCSTR Val(int nIndex) const {	return *(CLStr*)ME2MapStrToPtr::Val(nIndex); }
#ifdef _DEBUG
	void Dump();
#endif
};

#endif

